import { removeStorage } from '@/utils/storage'
import { clearDictList } from '@/utils/dict'
import { useAuthStore } from '@/stores/auth'
import { useMenuStore } from '@/stores/menu'

/**
 * 缓存清理工具类
 */
export class CacheManager {
  /**
   * 清除用户相关缓存
   */
  static clearUserCache(): void {
    removeStorage('opsli-username')
    removeStorage('opsli-avatar')
    removeStorage('opsli-permissions')
    removeStorage('opsli-perms')
    removeStorage('opsli-userInfo')
    removeStorage('opsli-token')
    
    // 清除store中的数据
    const authStore = useAuthStore()
    authStore.logout()
  }

  /**
   * 清除菜单和路由缓存
   */
  static clearMenuCache(): void {
    removeStorage('opsli-menus')
    removeStorage('opsli-routes')
    
    // 清除store中的数据
    const menuStore = useMenuStore()
    menuStore.resetRoutes()
  }

  /**
   * 清除字典缓存
   */
  static clearDictCache(): void {
    clearDictList()
  }

  /**
   * 清除所有系统缓存（除了token）
   */
  static clearSystemCache(): void {
    this.clearMenuCache()
    this.clearDictCache()
  }

  /**
   * 清除所有缓存（包括用户信息）
   */
  static clearAllCache(): void {
    this.clearUserCache()
    this.clearMenuCache()
    this.clearDictCache()
  }

  /**
   * 重新加载菜单和路由
   */
  static async reloadMenus(): Promise<void> {
    this.clearMenuCache()
    
    const menuStore = useMenuStore()
    try {
      await menuStore.getRouterList()
      console.log('菜单和路由已重新加载')
    } catch (error) {
      console.error('重新加载菜单失败:', error)
    }
  }

  /**
   * 重新加载字典
   */
  static reloadDicts(): void {
    this.clearDictCache()
    console.log('字典缓存已清除，下次使用时将重新加载')
  }

  /**
   * 获取所有缓存key列表
   */
  static getCacheKeys(): string[] {
    return [
      'opsli-username',
      'opsli-avatar', 
      'opsli-permissions',
      'opsli-perms',
      'opsli-userInfo',
      'opsli-token',
      'opsli-menus',
      'opsli-routes',
      'opsli:dict'
    ]
  }

  /**
   * 检查缓存状态
   */
  static getCacheStatus(): Record<string, boolean> {
    const keys = this.getCacheKeys()
    const status: Record<string, boolean> = {}
    
    keys.forEach(key => {
      const value = localStorage.getItem(key) || sessionStorage.getItem(key)
      status[key] = !!value
    })
    
    return status
  }
}

/**
 * 快捷方法 - 清除菜单缓存并重新加载
 */
export const refreshMenus = async (): Promise<void> => {
  await CacheManager.reloadMenus()
}

/**
 * 快捷方法 - 清除字典缓存
 */
export const refreshDicts = (): void => {
  CacheManager.reloadDicts()
}

/**
 * 快捷方法 - 清除系统缓存
 */
export const refreshSystemCache = (): void => {
  CacheManager.clearSystemCache()
}

export default CacheManager 